package com.paqCliente;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Vector;

import org.w3c.dom.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import libreria.ItemHistorico;
import libreria.historico;
import libreria.item;
import libreria.variableEscribir;



import org.xml.sax.InputSource;
import org.xml.sax.SAXException;



import android.content.Context;
import android.os.Environment;
import android.util.Log;

public  class xml_cliente {
	public static Document documentoXML;
	public static Element nodoservidor;

	public static void crearDocumento(String entrada) {

		DocumentBuilder db;
		try {
			db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		InputSource is = new InputSource();
		is.setCharacterStream(new StringReader(entrada));
		 documentoXML = db.parse(is);

		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 catch (ParserConfigurationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}

	public static void escribirXml(Context context) {
		try {

            TransformerFactory transformerfactory= TransformerFactory.newInstance();
            Transformer transformer=transformerfactory.newTransformer();

            DOMSource source=new DOMSource(documentoXML);
            FileOutputStream _stream=context.openFileOutput("confservidor.xml", Context.MODE_PRIVATE);
            StreamResult result=new StreamResult(_stream);
            transformer.transform(source, result);
			
			
		} catch (Exception e) {
			 Log.e("Ficheros", "Error al escribir fichero");
		}
	}
	
    public static void leerXml(Context context) {
        // 1. Obteher el objeto DocumentBuilderFactory
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
        	File p =context.getFilesDir();
        	FileInputStream fin = context.openFileInput("confservidor.xml");        	
            DocumentBuilder db = dbf.newDocumentBuilder();
            documentoXML = db.parse(fin);
          Log.e("leerxml", documentoXML.toString());
        } catch (ParserConfigurationException pce) {
            pce.printStackTrace();
        } catch (SAXException se) {
            se.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

//	public static Element generarPlc(plc_cliente miplc) {
//
//		item mi ;
//		alarma_cliente ma;
//		
//		Element nodoplc = documentoXML.createElement("plc");
//		nodoplc.setAttribute("id", miplc.getID());
//		nodoplc.setAttribute("nombre", miplc.getnombre());
//		nodoplc.setAttribute("ip", miplc.getip());
//		nodoplc.setAttribute("refresco", Integer.toString(miplc.getrefresco()));
//
//		for( int i = 0 ; i < miplc.variables.size() ; i++ ){
//			mi=(item) miplc.variables.get(i);
//
//			Element nodoitem = documentoXML.createElement("item");
//			nodoitem.setAttribute("nombre", mi.nombre);
////			nodoitem.setAttribute("tipoProtocolo",Integer.toString(mi.));
//			nodoitem.setAttribute("rango",Integer.toString(mi.rango));
//			nodoitem.setAttribute("tipo",Integer.toString(mi.tipoDato));
//			nodoitem.setAttribute("offset",Integer.toString(mi.offset));
//			nodoitem.setAttribute("representacion",Integer.toString(mi.representacion));
//			if (mi.historial!=null) nodoitem.setAttribute("historico",Integer.toString(mi.historial.size()));
//			else nodoitem.setAttribute("historico","0");
//			nodoitem.setAttribute("plotlong",Integer.toString(mi.plotlong));
//			nodoitem.setAttribute("granulado",Double.toString(mi.granulado));
//			
//			nodoplc.appendChild(nodoitem);
//		}
//		for( int i = 0 ; i < miplc.ListaAlarmas.size() ; i++ ){
//			ma=(alarma_cliente) miplc.ListaAlarmas.get(i);
//
//			Element nodoitem = documentoXML.createElement("alarma");
//			nodoitem.setAttribute("nombre", ma.nombre);
//			nodoitem.setAttribute("fuenteDato1",ma.fuenteDato1);
//			nodoitem.setAttribute("fuenteDato2",ma.fuenteDato2);
//			nodoitem.setAttribute("operador",Integer.toString(ma.operador));
//
//			nodoplc.appendChild(nodoitem);
//		}
//		for (int i = 0; i < miplc.paneles.size(); i++) {
//			Element nodopanel = documentoXML.createElement("panel");
//			nodopanel.setAttribute("titulo", miplc.paneles.get(i).titulo
//					.getText().toString());
//			nodoplc.appendChild(nodopanel);
//		}
//		return nodoplc;
//	}

/*	public static void generarServidor() {
		
		crearDocumento();
		Iterator it = servidor.plcs.iterator();
		nodoservidor.setAttribute("nombre", servidor.nombre);
		nodoservidor.setAttribute("password", servidor.password);

		while (it.hasNext()) {			
			plc e = (plc) it.next();
			nodoservidor.appendChild(generarPlc(e)) ;
			}
		documentoXML.appendChild(nodoservidor);
	}
*/
	public  static void parsearDocumento() {

		Element docEle = documentoXML.getDocumentElement();
//		servidor_cliente.nombre=docEle.getAttribute("nombre");
//		servidor_cliente.password=docEle.getAttribute("password");
		NodeList nl = docEle.getElementsByTagName("plc");
		if (nl != null && nl.getLength() > 0) {
			for (int i = 0; i < nl.getLength(); i++) {
				Element elemento = (Element) nl.item(i);
				servidor_cliente.plcs.add( obtenerPlc(elemento));
			}
		}
	}

	public static plc_cliente obtenerPlc(Element elemento) {
		plc_cliente miplc = new plc_cliente();
		miplc.id = elemento.getAttribute("id");
		miplc.nombre = elemento.getAttribute("nombre");
		miplc.ip = elemento.getAttribute("ip");
		miplc.refresco = Integer.parseInt(elemento.getAttribute("refresco"));

		java.util.ArrayList<item> variables = new ArrayList<item>();
		java.util.ArrayList<alarma_cliente> alarmas = new ArrayList<alarma_cliente>();
		java.util.ArrayList<panel> paneles = new ArrayList<panel>();

		// Map <String,item> variables = new HashMap <String,item> ();

		/*
		 * leer las variables
		 */
		NodeList nl = elemento.getElementsByTagName("item");
		for (int i = 0; i < nl.getLength(); i++) {
			Element el = (Element) nl.item(i);
			item variable = new item();
//			variable.plc = miplc.id;
			variable.nombre = el.getAttribute("nombre");
			variable.rango = Integer.parseInt(el.getAttribute("rango"));
			variable.offset = Integer.parseInt(el.getAttribute("offset"));
			variable.tipoDato = Integer.parseInt(el.getAttribute("tipo"));
			variable.granulado = Double.parseDouble(el
					.getAttribute("granulado"));


			variable.representacion = Integer.parseInt(el
					.getAttribute("representacion"));
			int size;
			if (!el.getAttribute("historico").equals("0")) {
				size = Integer.parseInt(el.getAttribute("historico"));
				variable.historial = new historico(size);
				ItemHistorico mitem = new ItemHistorico(new Double(0),
						new Date());
				variable.historial.meter(mitem);
		
			}

			
			if (el.getAttribute("plotlong")!= null && !el.getAttribute("plotlong").equals("")) {
				size = Integer.parseInt(el.getAttribute("plotlong"));
				variable.plotlong = size;
			}
				
			if (el.getAttribute("max")!= null &&  !el.getAttribute("max").equals("")) {
				double max = Double.parseDouble(el.getAttribute("max"));
				variable.max = max;
			}
			if (el.getAttribute("min")!= null && !el.getAttribute("min").equals("")) {
				double min = Double.parseDouble(el.getAttribute("min"));
				variable.min = min;
			}
			if (el.getAttribute("dim")!= null && !el.getAttribute("dim").equals("")) {
				variable.dim = el.getAttribute("dim");
			}
			if (el.getAttribute("panel")!= null && !el.getAttribute("panel").equals("")) {
				variable.panel = el.getAttribute("panel");
			}

			// variable.representacion=el.getAttribute("representacion");
			variables.add(variable);
		}

		miplc.variables = variables;
		miplc.ListaEscribir = new Vector<variableEscribir>();

		nl = elemento.getElementsByTagName("alarma");
		for (int i = 0; i < nl.getLength(); i++) {
			Element el = (Element) nl.item(i);
			int operador = Integer.parseInt(el.getAttribute("operador"));
			alarma_cliente mialarma = new alarma_cliente(el.getAttribute("nombre"),
					el.getAttribute("fuenteDato1"),
					el.getAttribute("fuenteDato2"), operador);
			alarmas.add(mialarma);
		}
		miplc.ListaAlarmas = alarmas;

		nl = elemento.getElementsByTagName("panel");
		for (int i = 0; i < nl.getLength(); i++) {
			Element el = (Element) nl.item(i);
			String titulo = el.getAttribute("titulo");
			miplc.paneles.add(titulo);
//			panel mipanel = new panel(cliente.ctx);
//			mipanel.tiltular(titulo);
//			paneles.add(mipanel);
		}
//		miplc.paneles = paneles;

		return miplc;

	}


}
